<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>httpd.conf文件如何配置KeepAlive | 失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		<article>
	
		<h1>httpd.conf文件如何配置KeepAlive</h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/Apache/">Apache</a> <a class="article__tag-link" href="/tags/LAMP/">LAMP</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;KeepAlive  意思为是否长连接。 后边可以设置 On 或者 Off</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;简单理解就是这样： 如果设置成On，那么当apache完成用户的请求后，那么apache进程不会断开用户的请求连接，依然保持连接状态。设置成Off则当apache完成用户的请求后，那么apache进程会立即断开和用户的请求连接。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果，完成用户的连接依然连接，这样的好处是：当该用户的请求在过来时，apache会用这个已经建立的连接，不需要重新创建连接。这样会节省CPU的资源。但是却耗费了内存。为什么呢？可以假设这样的场景。假如keepalive 超时时间为10s，而每1s中有100个用户请求访问，每个用户3次连接，每个连接耗费2M内存，那么10s内建立的连接次数为1000次（跟用户每s请求次数无关），消耗内存为1000<em>2=2000M，相反，如果不保持长连接，同样的环境场景下，每1s内有100</em>3个连接，下一秒还是100<em>3个连接，也就是说永远都是100</em>3个连接，那么1s内甚至10s内消耗的内存为100<em>3</em>2=600M。 然而，在这10s内创建的连接次数为100<em>3</em>10=3000次，这样肯定消耗了更多的cpu资源。毕竟每次tcp连接都是需要cpu去处理的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;问题来了，既然知道长连接与否的利与弊，那么如何判定什么时候On，什么时候Off？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在上面的举例中，涉及到了一个数，那就是每个用户在1s内请求的次数，你再回去好好看看，如果把3改为1，是不是10s内得到的连接次数总和是一样的。对！那么这样无论是On还是Off，消耗的CPU资源是一样的。所以，我们考虑3种情况：</p>
<ol>
<li>用户浏览一个网页时，除了网页本身外，还引用了多个 javascript 文件，多个 css 文件，多个图片文件，并且这些文件都在同一个 HTTP 服务器上。</li>
<li>用户浏览一个网页时，除了网页本身外，还引用一个 javascript 文件，一个图片文件。</li>
<li>用户浏览的是一个动态网页，由程序即时生成内容，并且不引用其他内容。</li>
</ol>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;对于上面3中情况，我认为：1 最适合打开 KeepAlive ，2 随意，3 最适合关闭 KeepAlive（连接消耗的内存比较大）</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;总结一下：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在内存非常充足的服务器上，不管是否关闭 KeepAlive 功能，服务器性能不会有明显变化；</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果服务器内存较少，或者服务器有非常大量的文件系统访问时，或者主要处理动态网页服务，关闭 KeepAlive 后可以节省很多内存，而节省出来的内存用于文件系统Cache，可以提高文件系统访问的性能，并且系统会更加稳定。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;目前的服务器，CPU很强，所以不用考虑频繁的tcp连接对cpu造成的压力，那还让它长连接干什么，故，建议关闭你的长连接吧！！！</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PS： 如果，你的服务器上请求量很大，那你最好还是关闭这个参数吧。我试过一次，打开长连接，并且设置超时时间为30s，结果仅仅十几s就把所有的httpd进程跑满。这样很危险的，直接让用户等待，等30s，这不扯淡嘛？即使是你设置成3s，照样会让用户等待3s，这样很不合理的。所以，归根结蒂还是关闭长连接吧，这样效率会更高。</p>

	

	
		<span class="different-posts"><a href="/2017/10/12/Apache/23. httpd.conf文件如何配置KeepAlive/" onclick="window.history.go(-1); return false;">⬅️ Go back </a></span>

	

</article>

	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
